//手动实现回调机制，使用一个线程来阻塞等待
#include <iostream>
#include <future>
#include <thread>
#include <functional>
#include <memory>

// 模拟异步任务
int exampleFunction(int a, int b) {
    std::this_thread::sleep_for(std::chrono::seconds(2));  // 模拟耗时操作
    return a + b;
}

// 回调函数
void callbackFunction(std::future<int> future) {
    std::cout << "Callback function is processing the result...\n";
    int result = future.get();  // 获取异步任务的结果
    std::cout << "Result: " << result << std::endl;
}

int main() {
    std::cout << "Main thread: Starting async task...\n";

    // 启动异步任务
    std::future<int> result = std::async(std::launch::async, exampleFunction, 10, 20);

    // 启动一个线程来处理回调函数
    std::thread callbackThread(callbackFunction, std::move(result));

    std::cout << "Main thread: Continuing execution...\n";

    // 等待回调线程完成
    callbackThread.join();

    return 0;
}

// //c++20
// #include <iostream>
// #include <future>
// #include <chrono>

// // 模拟异步任务
// int exampleFunction(int a, int b) {
//     std::this_thread::sleep_for(std::chrono::seconds(2));  // 模拟耗时操作
//     return a + b;
// }

// int main() {
//     std::cout << "Main thread: Starting async task...\n";

//     // 启动异步任务
//     std::future<int> result = std::async(std::launch::async, exampleFunction, 10, 20);

//     // 设置回调函数
//     result.then([](std::future<int> future) {
//         std::cout << "Callback function is processing the result...\n";
//         int result = future.get();  // 获取异步任务的结果
//         std::cout << "Result: " << result << std::endl;
//     });

//     std::cout << "Main thread: Continuing execution...\n";

//     // 等待异步任务完成
//     result.wait();

//     return 0;
// }